#ifndef __EXPRESSIONNODE__
#define __EXPRESSIONNODE__

#include"abstractnode.h"

using namespace std;

class ProgramNode;
class VariableNode;
class IntegerNode;

class ExpressionNode : public AbstractNode {
	
	public:
		
	ExpressionNode();
	ExpressionNode(ExpressionNode const &);
	~ExpressionNode();
	
	virtual ExpressionNode * eval(ProgramNode const &) const = 0;
	virtual bool isFreeVar(VariableNode const &) const = 0;
	virtual bool isBoundVar(VariableNode const &) const = 0;
	virtual ExpressionNode * subst(VariableNode const &, ExpressionNode const *) = 0;
	virtual ProgramNode * defun() const = 0;
	virtual IntegerNode deint() const = 0;
	
	virtual ExpressionNode * copy() const = 0;
	
	virtual string toString() const = 0;
	
};

#endif
